    package com.example.data.mapper;

    import com.example.data.entity.kg.KgRelation;
    import org.apache.ibatis.annotations.*;

    import java.util.List;

    /**
     * 知识图谱关系Mapper（操作kg_relation表）
     * 负责关系的批量插入、去重查询、溯源查询等
     */
    @Mapper
        public interface KgRelationMapper {

        /**
         * 批量插入关系（存在则忽略，避免违反唯一约束）
         * 依赖kg_relation表的uk_sub_obj_type_valid唯一索引实现去重
         * @param relations 待插入的关系列表
         */
        void batchInsert(@Param("list") List<KgRelation> relations);

        /**
         * 查询重复关系（按“主体ID+客体ID+关系类型”判断）
         * 用于代码层提前去重，减少数据库INSERT IGNORE的性能消耗
         * @param subjectId 主体实体ID
         * @param objectId 客体实体ID
         * @param relationType 关系类型
         * @return 存在则返回关系对象，不存在则返回null
         */
        KgRelation selectDuplicate(
                @Param("subjectId") Long subjectId,
                @Param("objectId") Long objectId,
                @Param("relationType") String relationType);

        /**
         * 按预处理数据ID查询关系（溯源：该预处理文本抽取了哪些关系）
         * @param sourcePreprocessedId 预处理数据ID
         * @return 该来源下的所有有效关系
         */
        List<KgRelation> selectByPreprocessedId(@Param("sourcePreprocessedId") Long sourcePreprocessedId);

        /**
         * 标记关系为无效（软删除，避免物理删除数据）
         * @param id 关系ID
         * @param isValid 有效性（0=无效，1=有效）
         */
        void updateValidStatus(@Param("id") Long id, @Param("isValid") Integer isValid);

        int selectTotalValidCount();

        /**
         * 按主体ID查询关系
         */
        List<KgRelation> selectBySubjectId(@Param("subjectId") Long subjectId);

        /**
         * 按主体ID+关系类型查询
         */
        List<KgRelation> selectBySubjectIdAndRelationType(
                @Param("subjectId") Long subjectId,
                @Param("relationType") String relationType);

        /**
         * 按客体ID查询关系
         */
        List<KgRelation> selectByObjectId(@Param("objectId") Long objectId);

        /**
         * 按客体ID+关系类型查询
         */
        List<KgRelation> selectByObjectIdAndRelationType(
                @Param("objectId") Long objectId,
                @Param("relationType") String relationType);

        /**
         * 按关系类型查询
         */
        List<KgRelation> selectByRelationType(@Param("relationType") String relationType);
    }